home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 476-500 / disk_480 / tpledit / src / savec.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  9KB  |  355 lines

  1.  
  2. /*
  3.  *  SAVEC.C
  4.  */
  5.  
  6. #include "defs.h"
  7.  
  8. Prototype void SaveProjectAsSrc(char *);
  9. Prototype void DeclareHeaders(FILE *);
  10. Prototype void DeclareNG(FILE *, short);
  11. Prototype void DeclareWIN(FILE *);
  12. Prototype void DeclareRG(FILE *, TplRegion *);
  13. Prototype void DeclareInitGads(FILE *);
  14. Prototype void DeclareFreeGads(FILE *);
  15.  
  16. static char *RgtKindAry[] = { "INVISIBLE", "BUTTON_KIND", "STRING_KIND", "LISTVIEW_KIND", "CYCLE_KIND" };
  17.  
  18. void
  19. SaveProjectAsSrc(name)
  20. char *name;
  21. {
  22.     FILE *fo;
  23.     TplRegion *rg;
  24.  
  25.     if (fo = fopen(name, "w")) {
  26.     short numRG = 0;
  27.  
  28.     fprintf(fo, "\n"
  29.             "/*\n"
  30.             " * %s\n"
  31.             " *\n"
  32.             " * MACHINE GENERATED\n"
  33.             " */\n\n",
  34.  
  35.             name
  36.         );
  37.  
  38.     DeclareHeaders(fo);
  39.  
  40.     for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
  41.         if (rg->rg_Type)
  42.         ++numRG;
  43.     }
  44.     DeclareNG(fo, numRG);
  45.     DeclareWIN(fo);
  46.  
  47.     for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
  48.         if (rg->rg_Type) {
  49.         DeclareRG(fo, rg);
  50.         }
  51.     }
  52.     DeclareInitGads(fo);
  53.     DeclareFreeGads(fo);
  54.     fclose(fo);
  55.     }
  56. }
  57.  
  58. void
  59. DeclareHeaders(fo)
  60. FILE *fo;
  61. {
  62.     fprintf(fo,
  63.     "#ifndef NO_GAD_HEADERS\n"
  64.     "#include <exec/types.h>\n"
  65.     "#include <exec/lists.h>\n"
  66.     "#include <intuition/intuition.h>\n"
  67.     "#include <intuition/screens.h>\n"
  68.     "#include <intuition/gadgetclass.h>\n"
  69.     "#include <libraries/gadtools.h>\n"
  70.     "#include <clib/gadtools_protos.h>\n"
  71.     "#endif\n"
  72.     "\n"
  73.     );
  74. }
  75.  
  76. void
  77. DeclareNG(fo, nrg)
  78. FILE *fo;
  79. short nrg;
  80. {
  81.     TplRegion *rg;
  82.     short i;
  83.  
  84.     for (i = 0, rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
  85.     if (rg->rg_Type) {
  86.         fprintf(fo, "#define NG_%s (NGAry + %d)\n", rg->rg_Node.ln_Name, i);
  87.         ++i;
  88.     }
  89.     }
  90.     for (i = 0, rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
  91.     if (rg->rg_Type) {
  92.         fprintf(fo, "#define GAD_%s %d\n", rg->rg_Node.ln_Name, i);
  93.         ++i;
  94.     }
  95.     }
  96.  
  97.     fprintf(fo, "\nstruct NewGadget NGAry[%d] = {\n", nrg);
  98.     for (rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
  99.     if (rg->rg_Type) {
  100.         fprintf(fo, "    { %d,%d,%d,%d,",
  101.         rg->rg_Box.bo_Xs,
  102.         rg->rg_Box.bo_Ys,
  103.         rg->rg_Box.bo_Xe - rg->rg_Box.bo_Xs + 1,
  104.         rg->rg_Box.bo_Ye - rg->rg_Box.bo_Ys + 1
  105.         );
  106.  
  107.         if (rg->rg_LabText)
  108.         fprintf(fo, "\"%s\",", rg->rg_LabText);
  109.         else
  110.         fprintf(fo, "(void *)0L,");
  111.  
  112.         fprintf(fo, "(void *)0L,GAD_%s,0x%04x,(void *)0L }%s\n",
  113.         rg->rg_Node.ln_Name, rg->rg_Flags,
  114.         (GetSucc(&rg->rg_Node) ? "," : "")
  115.         );
  116.     }
  117.     }
  118.     fprintf(fo, "};\n\n");
  119. }
  120.  
  121. void
  122. DeclareWIN(fo)
  123. FILE *fo;
  124. {
  125.     fprintf(fo, "#define WIN_LEFT   %d\n", Ph.ph_WinDim.bo_Xs);
  126.     fprintf(fo, "#define WIN_TOP    %d\n", Ph.ph_WinDim.bo_Ys);
  127.     fprintf(fo, "#define WIN_WIDTH  %d\n", Ph.ph_WinDim.bo_Xe - Ph.ph_WinDim.bo_Xs);
  128.     fprintf(fo, "#define WIN_HEIGHT %d\n", Ph.ph_WinDim.bo_Ye - Ph.ph_WinDim.bo_Ys);
  129.     fprintf(fo, "\n");
  130. }
  131.  
  132. void
  133. DeclareRG(fo, rg)
  134. FILE *fo;
  135. TplRegion *rg;
  136. {
  137.     fprintf(fo, "struct Gadget *Gad_%s;\n", rg->rg_Node.ln_Name);
  138.  
  139.     switch(rg->rg_Type) {
  140.     case RGT_BUTTON:
  141.     break;
  142.     case RGT_ENTRY:
  143.     fprintf(fo, "char *Buf_%s;\n", rg->rg_Node.ln_Name);
  144.     fprintf(fo, "char *DefText_%s = ", rg->rg_Node.ln_Name);
  145.     if (rg->rg_DefText && rg->rg_DefText[0])
  146.         fprintf(fo, "\"%s\";\n", rg->rg_DefText);
  147.     else
  148.         fprintf(fo, "(char *)0L;\n");
  149.     break;
  150.     case RGT_SELLIST:
  151.     {
  152.         MaxNode *mn;
  153.         short i;
  154.         short cnt;
  155.  
  156.         for (cnt = 0, mn = GetHead(&rg->rg_ListSet); mn; ++cnt, mn = GetSucc(mn));
  157.  
  158.         if (cnt) {
  159.         fprintf(fo, "extern struct MinList List_%s;\n", rg->rg_Node.ln_Name);
  160.         fprintf(fo, "long SelNo_%s = %d;\n", rg->rg_Node.ln_Name, ((rg->rg_DefText) ? atoi(rg->rg_DefText) : 0));
  161.         fprintf(fo, "struct Node NodeAry_%s[%d] = {\n", rg->rg_Node.ln_Name, cnt);
  162.  
  163.         for (i = 0, mn = GetHead(&rg->rg_ListSet); mn; ++i, mn = GetSucc(mn)) {
  164.             fprintf(fo, "    { ");
  165.             if (GetSucc(mn))
  166.             fprintf(fo, "NodeAry_%s + %d, ", rg->rg_Node.ln_Name, i + 1);
  167.             else
  168.             fprintf(fo, "(struct Node *)&List_%s.mlh_Tail, ", rg->rg_Node.ln_Name);
  169.             if (GetPred(mn))
  170.             fprintf(fo, "NodeAry_%s + %d, ", rg->rg_Node.ln_Name, i - 1);
  171.             else
  172.             fprintf(fo, "(struct Node *)&List_%s.mlh_Head, ", rg->rg_Node.ln_Name);
  173.             fprintf(fo, "0, 0, \"%s\" }%s\n", mn->ln_Name, (i == cnt - 1) ? "" : ",");
  174.         }
  175.         fprintf(fo, "};\n\n");
  176.         }
  177.         fprintf(fo, "struct MinList List_%s = { ", rg->rg_Node.ln_Name);
  178.         if (cnt)
  179.         fprintf(fo, "&NodeAry_%s[0], ", rg->rg_Node.ln_Name);
  180.         else
  181.         fprintf(fo, "(struct MinNode *)&List_%s.mlh_Tail, ", rg->rg_Node.ln_Name);
  182.         fprintf(fo, "(void *)0L, ");
  183.         if (cnt)
  184.         fprintf(fo, "&NodeAry_%s[%d]", rg->rg_Node.ln_Name, cnt - 1);
  185.         else
  186.         fprintf(fo, "(struct MinNode *)&List_%s.mlh_Head", rg->rg_Node.ln_Name);
  187.         fprintf(fo, " };\n");
  188.     }
  189.     break;
  190.     case RGT_CYCLE:
  191.     {
  192.         short i = 0;
  193.  
  194.         fprintf(fo, "char *StatAry_%s[] = { ", rg->rg_Node.ln_Name);
  195.         if (rg->rg_CycleAry) {
  196.         char *ptr;
  197.         for (; ptr = rg->rg_CycleAry[i]; ++i)
  198.             fprintf(fo, "%s\"%s\"", ((i) ? ", " : ""), ptr);
  199.         }
  200.         fprintf(fo, "%s(void *)0 };\n", ((i) ? ", " : ""));
  201.         fprintf(fo, "char **Ary_%s = StatAry_%s;\n",
  202.         rg->rg_Node.ln_Name,
  203.         rg->rg_Node.ln_Name
  204.         );
  205.         fprintf(fo, "long SelNo_%s = %d;\n", rg->rg_Node.ln_Name, ((rg->rg_DefText) ? atoi(rg->rg_DefText) : 0));
  206.     }
  207.     break;
  208.     }
  209. }
  210.  
  211. /*
  212.  *  InitGads and FreeGads
  213.  */
  214.  
  215. void
  216. DeclareInitGads(fo)
  217. FILE *fo;
  218. {
  219.     short i;
  220.     short j;
  221.     TplRegion *rg;
  222.  
  223.     fprintf(fo, "\n\n"
  224.         "struct Gadget *GList;\n"
  225.         "struct VisualInfo *VisInfo;\n"
  226.         "\n"
  227.         );
  228.  
  229.     fprintf(fo, "\n\n"
  230.         "struct Gadget *\n"
  231.         "InitGads(scr)\n"
  232.         "struct Screen *scr;\n"
  233.         "{\n"
  234.         "    struct Gadget *gad;\n"
  235.         "    short i;\n"
  236.         "\n"
  237.         );
  238.     fprintf(fo, "    GList = (void *)0;\n");
  239.  
  240.     /*
  241.      *    Step 1, allocate VisInfo
  242.      */
  243.  
  244.     fprintf(fo, "    if ((VisInfo = GetVisualInfo(scr, TAG_END)) == NULL)\n");
  245.     fprintf(fo, "\treturn((void *)0L);\n");
  246.  
  247.     /*
  248.      *    Step 2, apply to NGAry ng_VisualInfo & ng_TextAttr (from screen)
  249.      */
  250.  
  251.     fprintf(fo, "\n    {\n");
  252.     fprintf(fo, "\tstruct NewGadget *ng;\n");
  253.     fprintf(fo, "\tfor (i = 0, ng = NGAry; i < sizeof(NGAry)/sizeof(NGAry[0]); ++i, ++ng) {\n");
  254.     fprintf(fo, "\t    ng->ng_VisualInfo = VisInfo;\n");
  255.     fprintf(fo, "\t    ng->ng_TextAttr = scr->Font;\n");
  256.     fprintf(fo, "\t}\n");
  257.     fprintf(fo, "    }\n");
  258.  
  259.     /*
  260.      *    Step 3, allocate GList
  261.      */
  262.  
  263.     fprintf(fo, "    if ((gad = CreateContext(&GList)) == NULL)\n");
  264.     fprintf(fo, "\treturn((void *)0L);\n");
  265.  
  266.     /*
  267.      *    Step 4, allocate gadgets
  268.      *
  269.      *    Allocation is a two pass process.  The first pass deals with those
  270.      *    gadgets that do not depend on other gadgets.  The second pass
  271.      *    deals with those gadgets that DO depend on other gadgets.
  272.      */
  273.  
  274.     for (j = 0; j < 2; ++j) {
  275.     for (i = -1, rg = GetHead(&RegList); rg; rg = GetSucc(&rg->rg_Node)) {
  276.         if (rg->rg_Type) {
  277.         ++i;
  278.         if (j == 0) {
  279.             rg->rg_Flags &= ~RGF_DEFERED;
  280.             if (rg->rg_LockedTo) {
  281.             rg->rg_Flags |= RGF_DEFERED;
  282.             continue;
  283.             }
  284.         } else {
  285.             if ((rg->rg_Flags & RGF_DEFERED) == 0)
  286.             continue;
  287.         }
  288.         fprintf(fo, "    Gad_%s = gad = CreateGadget(%s, gad, NGAry + %d,\n",
  289.             rg->rg_Node.ln_Name,
  290.             RgtKindAry[rg->rg_Type],
  291.             i
  292.         );
  293.  
  294.         switch(rg->rg_Type) {
  295.         case RGT_BUTTON:
  296.             break;
  297.         case RGT_ENTRY:
  298.             fprintf(fo, "\tGTST_MaxChars, %d,\n", rg->rg_MaxBufLen);
  299.             fprintf(fo, "\tGTST_String, DefText_%s,\n", rg->rg_Node.ln_Name);
  300.             break;
  301.         case RGT_SELLIST:
  302.             fprintf(fo, "\tGTLV_Labels, &List_%s,\n", rg->rg_Node.ln_Name);
  303.             fprintf(fo, "\tGTLV_Selected, SelNo_%s,\n", rg->rg_Node.ln_Name);
  304.             if (rg->rg_LockedTo)
  305.             fprintf(fo, "\tGTLV_ShowSelected, Gad_%s,\n", rg->rg_LockedTo->rg_Node.ln_Name);
  306.             break;
  307.         case RGT_CYCLE:
  308.             fprintf(fo, "\tGTCY_Labels, Ary_%s,\n", rg->rg_Node.ln_Name);
  309.             fprintf(fo, "\tGTCY_Active, SelNo_%s,\n", rg->rg_Node.ln_Name);
  310.             break;
  311.         }
  312.         fprintf(fo, "\tTAG_END\n");
  313.         fprintf(fo, "    );\n");
  314.         fprintf(fo, "    if (gad == NULL)\n");
  315.         fprintf(fo, "\treturn(NULL);\n");
  316.  
  317.         switch(rg->rg_Type) {
  318.         case RGT_ENTRY:
  319.             fprintf(fo, "    Buf_%s = ((struct StringInfo *)gad->SpecialInfo)->Buffer;\n", rg->rg_Node.ln_Name);
  320.         }
  321.         fprintf(fo, "\n");
  322.         }
  323.     }
  324.     }
  325.  
  326.     /*
  327.      *    return GList
  328.      */
  329.  
  330.     fprintf(fo, "    return(GList);\n");
  331.     fprintf(fo, "}\n\n");
  332. }
  333.  
  334. /*
  335.  *  Free the GList and return
  336.  */
  337.  
  338. void
  339. DeclareFreeGads(fo)
  340. FILE *fo;
  341. {
  342.     fprintf(fo, "\n\n"
  343.         "void\n"
  344.         "FreeGads(void)\n"
  345.         "{\n"
  346.         "    FreeGadgets(GList);\n"
  347.         "    if (VisInfo)\n"
  348.         "        FreeVisualInfo(VisInfo);\n"
  349.         "    VisInfo = NULL;\n"
  350.         "    GList = NULL;\n"
  351.         "}\n"
  352.         );
  353. }
  354.  
  355.